(define-class procedure object
  (args name arglist)
  (fields name arglist)
  (methods infer-application-type
	   compile-call
	   evaluate-call))

(define-class native-procedure procedure
  (args name arglist real-proc native-name)
  (fields real-proc native-name))

(define-class native-operator native-procedure
  (args name arglist real-proc native-name precedence operator-type)
  (fields precedence operator-type))

(define the-conditional-operator
  (new native-operator 'conditional-operator
       '(test consequent alternative)
       #f
       "?"
       0
       (new conditional-operator-type)))

(define-class field-accessor procedure)

(define-class generic-procedure procedure)
(define-class compound-procedure procedure
  (args name arglist body parent-environment)
  (fields body parent-environment))

(define-class field procedure
  (args name field-type)
  (fields name field-type))

(define-class method procedure
  (args name method-keywords method-type)
  (fields name method-keywords method-type))

(define-class new-operator procedure
  (args))

(define-class new-array-operator procedure
  (args))